package sige

class CaixaDiario {

    static constraints = {
        dataDeAbertura unique:true
        dataDeFechamento nullable: true
        despesaTotalDiaria scale:2, blanK: true
        receitaTotalDiaria scale:2, blanK: true
        sangriaTotalDiaria scale:2, blanK: true
        suprimentoTotalDiario scale:2 , blanK: true
        saldo scale:2, blanK: true
    }
    
    static CaixaDiario aberto(){
        CaixaDiario.findByFechado(false)
    }
    
    Date dataDeAbertura
    Date dataDeFechamento
    boolean fechado
    double despesaTotalDiaria
    double receitaTotalDiaria
    double sangriaTotalDiaria
    double suprimentoTotalDiario
    double saldo
    
    double getSaldo(){
        if(fechado){
            return saldo
        }
        receitaTotalDiaria + suprimentoTotalDiario - despesaTotalDiaria - sangriaTotalDiaria
    }
    
    double getSangriaTotalDiaria(){
        if(fechado){
            return sangriaTotalDiaria
        }
        def result = Sangria.withCriteria {
            pagamentos{
                caixaDiario{
                    eq("id", id)
                }
            }
            projections {
                sum('valorBase')
            }
        }
        result[0] ?: 0L
    }
    
    double getSuprimentoTotalDiario(){
        if(fechado){
            return suprimentoTotalDiario
        }
        def result = Suprimento.withCriteria {
            pagamentos{
                caixaDiario{
                    eq("id", id)
                }
            }
            projections {
                sum('valorBase')
            }
        }
        result[0] ?: 0L
    }
    
    double getDespesaTotalDiaria(){
        if(fechado){
            return despesaTotalDiaria
        }
        def result = Pagamento.withCriteria {
            movimentacao {
                ordem{
                    eq("tipo", "Despesa")
                }
            }
            caixaDiario{
                eq("id", id)
            }
            projections {
                sum('total')
            }
        }
        result[0] ?: 0L
    }
    
    double getReceitaTotalDiaria(){
        if(fechado){
            return receitaTotalDiaria
        }
        def result = Pagamento.withCriteria {
            movimentacao {
                ordem{
                    eq("tipo", "Receita")
                }
            }
            caixaDiario{
                eq("id", id)
            }
            projections {
                sum('total')
            }
        }
        result[0] ?: 0L
    }
    
    double getSaldoTotal(){
        def result = CaixaDiario.withCriteria {
            projections {
                sum('saldo')
            }
        }
        result[0]
    }
}
